const { httpGet, httpPost } = require("../HTTP"); //用于render的service不能require Common
const { Task } = require("../Task");

/**
 * pvf.js 对工具提供的API进行封装
 * 
 * 函数命名应保持和工具API一致
 */


/** pvfUitilty接口封装 
 *  基于2022.8.5 测试通过
 *  旧api文档 https://gitee.com/icshare/pvfUtilityWebApi/tree/adf714f03b79415d5112849da22739048e0e7f54
*/
const pvfUtilityBaseUrl = "Api/PvfUtiltiy";

const pvfUtility = {

    //获取pvf工具版本号
    //@version2022.9.30.2
    // GetVersion(ip, port) {
    //     return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetVersion`)
    // },

    //获取文件列表
    //@param dirName:String  目录名
    GetFileList(ip, port, dirName) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetFileList?dirName=${dirName}&returnType=0`)
    },

    //获取Pvf根目录列表
    // @version 2022.9.30.2
    // GetPvfRootDirectory(ip, port) {
    //     return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetPvfRootDirectory`)
    // },

    //获取文件内容
    //@param filePath:String 文件路径
    GetFileContent(ip, port, filePath) {
        const decFlag = false; //已禁用兼容性反编译器
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetFileContent?filePath=${filePath}&useCompatibleDecompiler=${decFlag}`)
    },

    // 批量获取文件内容
    // @version 2022.9.30.2
    // @param fielList:String[] 文件路径，["creature/aquajello/aquajello.cre"]
    // GetFileContents(ip, port, fielList) {
    //     const decFlag = false;
    //     return httpPost(ip, port, `${pvfUtilityBaseUrl}/GetFileContents`, {
    //         "FileList": fielList,
    //         "UseCompatibleDecompiler": decFlag,
    //         "EncodingType": encode || null
    //     })
    // },

    // 获取所有lst文件列表
    GetAllLstFileList(ip, port) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetAllLstFileList`)
    },

    // 上传新的文件内容
    // 如果已存在则修改文件内容
    //@param filePath:String 文件路径
    //@param fileText:String 文件内容
    ImportFile(ip, port, filePath, fileText) {
        return httpPost(ip, port, `${pvfUtilityBaseUrl}/ImportFile?filePath=${filePath}`, fileText)
    },

    //批量上传新的文件内容
    //@param tType:String
    //@param params:Array<Map<String,String>>  [{"FilePath":"文件路径","FileContent":"文件内容"}]
    // ImportFiles(ip, port, params) {
    //     return httpPost(ip, port, `${pvfUtilityBaseUrl}/ImportFiles`, params)
    // },

    //删除文件
    //@param filePath:String 文件路径
    DeleteFile(ip, port, filePath) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/DeleteFile?filePath=${filePath}`)
    },

    //批量删除文件
    //@param filePaths:Array<String> 文件路径，["creature/aquajello/aquajello.cre"]
    DeleteFiles(ip, port, filePaths) {
        return httpPost(ip, port, `${pvfUtilityBaseUrl}/DeleteFiles`, JSON.stringify(filePaths))
    },

    // 获取物品信息
    // @param filePath:String
    GetItemInfo(ip, port, filePath) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetItemInfo?filePath=${filePath}`)
    },

    // 批量获取物品信息
    // @param params:String[] 文件路径
    GetItemInfos(ip, port, params) {
        return httpPost(ip, port, `${pvfUtilityBaseUrl}/GetItemInfos`, JSON.stringify(params))
    },

    //获取文件资源管理器具有焦点的文件路径
    //左侧文件树选定的文件
    //如果多选，则返回最后选定的文件或文件夹
    GetTreeListFocusedFilePath(ip, port) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetTreeListFocusedFilePath`)
    },

    //获取查找面板文件资源管理器具有焦点的文件路径
    //左侧文件树选定的文件 作用基本同上
    GetSearchPanelTreeListFocusedFilePath(ip, port) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetSearchPanelTreeListFocusedFilePath`)
    },

    //获取当前正在编辑文档的文件路径
    GetActiveDocumentFilePath(ip, port) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetActiveDocumentFilePath`)
    },


    // "文件路径集合"转换为"lst字典集合" 
    // 若该文件没有在lst注册 则不会返回
    // @param params:String[]  文件路径
    /*
        请求参数：["equipment/character/common/amulet/100300001.equ","equipment/character/common/amulet/100300004.equ","equipment/character/common/amulet/100300008.equ"]
        返回结果：{
            "Data": {
                "equipment/equipment.lst": {
                    "100300008": "character/common/amulet/100300008.equ",
                    "100300001": "character/common/amulet/100300001.equ"
                }
            },
            "IsError": false,
            "Msg": null
        }
    */
    FileListToLstRows(ip, port, params) {
        return httpPost(ip, port, `${pvfUtilityBaseUrl}/FileListToLstRows`, JSON.stringify(params))
    },

    // 确认文件是否存在
    // 测试无效
    // @param filePath:String
    FileIsExists(ip, port, filePath) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/FileIsExists?filePath=${filePath}`)
    },

    // 获取文件资源管理器选中文件集合
    // 选择文件夹时连带返回里面的所有文件路径
    GetTreeSelectedFiles(ip, port) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetTreeSelectedFiles`)
    },

    // 获取查找面板文件资源管理器选中文件集合
    // 右侧查找面板文件树
    GetSearchPanelSelectedFiles(ip, port) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetSearchPanelSelectedFiles`)
    },

    SaveAsPvfFileLock: false,
    SaveAsPvfFileDelay: 10000,

    // pvf封包另存为
    // 要限制使用频率,工具内部报错且没有返回信息
    // @param filePath:String  另存为路径(完整路径 D:\xx\script.pvf)
    SaveAsPvfFile(ip, port, filePath) {
        if (this.SaveAsPvfFileLock) {
            return new Promise((res, rej) => {
                rej(new Error("请勿频繁调用接口!"))
            })
        }

        //加锁
        this.SaveAsPvfFileLock = true;
        setTimeout(() => {
            this.SaveAsPvfFileLock = false;
        }, this.SaveAsPvfFileDelay)

        let uri = `${pvfUtilityBaseUrl}/SaveAsPvfFile?filePath=${filePath}`;
        uri = uri.replace(/([\u4e00-\u9fa5])/g, (str) => encodeURIComponent(str))
        return httpGet(ip, port, uri)
    },

    // 获取当前封包路径
    // 测试无效
    GetPvfPackFilePath(ip, port,) {
        return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetPvfPackFilePath`)
    },

    // 搜索PVF
    // @version 2022.9.30.2
    // @param params:type SearchPvfParam
    /*
        {
            "Keyword": string,              //查询关键字  type=0,1,2,3时有效
            "SearchFolder": string,         //搜索文件夹
            "FileTypesString": null,        //文件类型后缀   .nut;.stk  以;分割
            "RemoveOrKeep": 1,              //保留后缀or排除后缀  0:排除 1保留
            "Type": 1,                      //搜索类型: 0：整数/浮点数 1:字符串链接/字符串 2:文件名  3:名称 4:脚本文件内容
            "SourceType": 0,                //查找范围: 0:在所有文件中搜索 1:从搜索结果匹配 2:从搜索结果排除
            "UseRegularExpression": false,  //是否使用正则
            "WholeWordMatch": false,        //全词匹配
    
            "NormalUsing": 1,               //?? 可能是内部搜索模式 默认写1
            "IsStartMatch": false,          //?? 是否从首字母开始匹配  可能是tpye=0,1,2,3时,keyword从头开始匹配
            "SearchResult": null,           //?? 应该是tsourceType=1,2时 搜索结果列表
            "IsUseLikeSearchPath": false,   //?? 是否使用模糊路径查询  与searchFolder关联
    
            "ScriptContentSearchMode": 1,   //?? 脚本搜索模式  
            "Trait": false,                 //脚本搜索,是否使用特征搜索
            "ScriptContent": string,        //脚本搜索，脚本内容     trait=false时有效
            "ScriptContentStart": string,   //脚本搜索,开始特征字符串 trait=true时有效
            "ScriptContentStop": string,    //脚本搜索,结束特征字符串 trait=true时有效
        }
    */
    // SearchPvf(ip, port, param) {
    //     return httpPost(ip, port, `${pvfUtilityBaseUrl}/SearchPvf`, {
    //         "Type": param.type,
    //         "Trait": param.trait,
    //         "Keyword": param.keyword,
    //         "SearchFolder": param.searchFolder,
    //         "FileTypesString": param.fileTypesString,
    //         "RemoveOrKeep": param.removeOrKeep,
    //         "SourceType": param.sourceType,
    //         "UseRegularExpression": param.useRegularExpression,
    //         "WholeWordMatch": param.wholeWordMatch,
    //         "NormalUsing": param.normalUsing,
    //         "IsStartMatch": param.isStartMatch,
    //         "SearchResult": param.searchResult,
    //         "IsUseLikeSearchPath": param.isUseLikeSearchPath,
    //         "ScriptContentSearchMode": param.scriptContentSearchMode,
    //         "ScriptContent": param.scriptContent,
    //         "ScriptContentStart": param.scriptContentStart,
    //         "ScriptContentStop": param.scriptContentStop,
    //     })
    // },

    // 获取物品代码对应的文件 
    // 使用物品代码转换文件信息
    // @version 2022.9.30.2
    // @param lstNames:string   物品所在lst路径(equipment 或 stackable)
    // @param itemCode:string|number
    // ItemCodeToFileInfo(ip, port, lstNames, itemCode) {
    //     return httpGet(ip, port, `${pvfUtilityBaseUrl}/ItemCodeToFileInfo?lstNames=${lstNames}&itemCode=${itemCode}`)
    // },

    //批量获取物品代码对应的文件 
    // @version 2022.9.30.2
    // @param params:   {"lstNames":["equipment","stackable"],"ItemCodes":[1251,27098]}
    // ItemCodesToFileInfos(ip, port, params) {
    //     return httpPost(ip, port, `${pvfUtilityBaseUrl}/ItemCodesToFileInfos`, params)
    // },

    GetFileIconLock:false,
    GetFileIconDelay:500,

    // 获取文件Icon图标(可用于开发预览插件)
    // @version 2022.9.30.2
    // 警告：请不要频繁的访问此接口 pvfUtility限制每0.5秒只能访问一次
    // 返回Base64字符串jpeg格式
    // @param filePath:string
    // GetFileIcon(ip, port, filePath) {
    //     return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetFileIcon?filePath=${filePath}`)
    // },

    // 获取lst文件内容(解析完的)
    // @version 2022.11.6.1
    // @param file:string 文件路径(只能填写lst文件路径)
    // GetLstFile(ip, port, file) {
    //     return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetLstFileInfo?filePath=${file}`)
    // },

    // 获取字符串表：stringtable.bin明文数据
    // @version 2022.11.11.1
    // GetStringTable(ip, port) {
    //     return httpGet(ip, port, `${pvfUtilityBaseUrl}/GetStringTable`)
    // },
}


/**pvfedit接口封装 
 * 基于最后一个版本 测试通过
 * https://gitee.com/KingNw/pvfedit/blob/master/HttpServer.md
*/

const pvfEdit = {

    //获取文件集合
    //@param value:string 文件夹路径
    /*
        Full    全部(慎用，返回几万个文件路径)
        ""      等价于Full
        可以填写任意文件夹路径,但不能是文件路径
    */
    GetFilePaths(ip, port, value) {
        const params = { "Cmd": 1, "Value": value }
        return httpPost(ip, port, "", params)
    },

    //获取文件内容
    //@param path:string
    GetFileText(ip, port, path) {
        const params = {
            "Cmd": 0,
            "Value": path,
            "UseDecompile": "1"
        }
        return httpPost(ip, port, "", params)
    },

    //写入/更新文件
    //@param path:string  文件完整路径。 不存在则新增，存在则更新内容
    //@param fileText:string 文件内容
    WriteFile(ip, port, path, fileText) {
        const params = {
            "Cmd": 2,
            "Value": path,
            "FileText": fileText,
            "ExtractSet":
            {
                "IsEncryptScript": true, //是否编译脚本文件
                "IsEncryptAni": true,    //是否编译ani文件
                "IsConvertChinese": false //是否简体转繁体
            }
        }
        return httpPost(ip, port, "", params)
    },

    //获取物品名称和代码
    //@param path:string 文件路径
    GetItemNameAndItemCode(ip, port, path) {
        const params = {
            "Cmd": 3,
            "Value": path
        }
        return httpPost(ip, port, "", params)
    },

    //批量删除文件
    //@param filePaths:Array<string>  文件路径
    DeleteFiles(ip, port, filePaths) {
        const params = {
            "Cmd": 5,
            "FilePaths": filePaths
        }
        return httpPost(ip, port, "", params)
    },


    //获取当前PVF所在路径
    GetTreeCheckedFiles(ip, port) {
        const params = {
            "Cmd": 6,
        }
        return httpPost(ip, port, "", params)
    },

    //获取Pvf文件管理器选中文件集合
    GetTreeCheckedFiles(ip, port) {
        const params = {
            "Cmd": 8,
        }
        return httpPost(ip, port, "", params)
    },

    //获取搜索结果文件管理器选中文件集合
    GetTreeCheckedFilesFromSearchResult(ip, port) {
        const params = {
            "Cmd": 9,
        }
        return httpPost(ip, port, "", params)
    },
}

module.exports = {
    pvfUtility,
    pvfEdit
}